Skip to content

docs(pm-skill): the eighth readings increment — 17 landed lines, five in-place corrections, ceiling 402 → 419 - #17084

Merged
os-zhuang merged 1 commit into
mainfrom
claude/issue-16779-platform-readings-eighth-increment
Sep 9, 2026
Merged

docs(pm-skill): the eighth readings increment — 17 landed lines, five in-place corrections, ceiling 402 → 419#17084
os-zhuang merged 1 commit into
mainfrom
claude/issue-16779-platform-readings-eighth-increment

Conversation

@yinlianghui

@yinlianghui yinlianghui commented Sep 9, 2026

Copy link
Copy Markdown
Collaborator

Fixes #16779

Governed surface (.claude/**) — draft only. No seat flips this ready, enqueues it, or arms auto-merge (Prime Directive #14); a human merge is the review record.

The eighth platform-readings.md increment. The carrier card invited riders as comments, so the candidate set is 25 readings — 4 in the body, 21 across its eleven rider comments. Deduplicated against the file: 20 landed (17 new lines plus 5 corrections paid in place), 3 already present, 2 refused. Ceiling 402 → 419, taken under the STANDING one-file exception rather than a decision card, recorded as a ruledRaises record quoting the exception verbatim.

1. The footer family, folded into one truth table before any line was written

Five riders and both body readings land in one cell, and they disagree as long as the channel is read as the variable. Sorted by what the SENT body ended with, they stop disagreeing:

channel action sent body's tail stored result
bare REST POST /pulls create not rule-line terminated 90 B block appended (ledger :311, re-confirmed by one rider)
MCP create_pull_request create footer with no rule line above it whole block appended (body reading 1; riders A and the 02:2xZ rider)
MCP create_pull_request create blank line, rule line, session-URL footer exactly one footer — nothing appended (body reading 1)
bare REST POST /pulls create rule line + session-URL footer nothing appended, Δ = one stripped trailing newline (rider D)
bare REST POST /pulls create rule line + footer, one block nothing appended, unified diff empty (rider E)
MCP update_pull_request edit, no body in the call three tail blocks survived verbatim (rider C)
MCP update_pull_request edit, title + draft, no body footerless body stayed footerless (body reading 2)
MCP update_pull_request edit, whole body re-sent with its footers already terminated both survived byte-for-byte (ledger :309)
MCP update_pull_request edit, footerless body no footer still no footer — no synthesis (ledger :310)
MCP update_pull_request edit not recorded footer block DELETED (ledger :307)
bare REST PATCH /pulls edit bare footer appended, existing session-URL footer kept, Δ 58 B (ledger :308)
REST PATCH /issues/comments/{id} comment edit ×6 block already present byte-identical, one footer (rider F)
both channels comment create +58 B (ledger :315)

On create the channel is not the variable — the sent body's tail is. That is what the ledger's create row got wrong by attributing the append to bare REST only, and what rider A's framing got wrong by widening the attribution instead of replacing it. One row is outside the fit — :307, the strip — and its input shape was never recorded, so it lands as exactly that: the one observation the discriminator does not explain, handled at worst case. ⛔ No controlled pair exists (two bodies differing only in the rule-line block, same channel, same session), so this is written as a fit, not as a finding, and the standing 写后必回读 is untouched.

Two first-hand corroborations taken in this container while writing the increment, on the two PRs the body reading names: the stored body of the PR created with the block form carries exactly one footer (_Generated by …/session_…_, one occurrence, zero Generated with blocks); the PR whose body was later edited footerless carries zero — the title-only update neither stripped nor synthesised anything.

2. In-place corrections (line-neutral, they buy nothing)

line before → after the reading that forced it
:311 bare-REST-only attribution → both channels, keyed on the sent tail riders A, D, E + body reading 1
:313 「随通道与动作变」 → 「随动作与送出体尾部变,改侧还随通道变」 same — the create side is channel-invariant
:109 「带与不带 token 都 exit 0」 → adds 「真缺声明照常退 4」 rider F reading 2 — lifted out of its paragraph the row read as "always exits 0 in-container", and the error direction is that a seat discounts a real refusal
:167 「限定符形回 total_count: 0」 → 「限定符形亦可回 …」 the camelCase rider's own control: repo: qualifier + hyphenated slug returned the full result set in the same sequence
:163 「不覆盖 issue search,搜索页无 SSR 结果」 → 「搜索页只给锚点不给正文」 re-measured here, see §3

3. What was re-measured in this container rather than relayed

  • The public issues query page does serve SSR anchors, and its label: filters really AND. …/issues?q=is:issue+is:open+label:"pm:queue"+label:"domain:skills" → HTTP 200, 10 distinct href="/objectstack-ai/objectstack/issues/N" anchors; REST GET /issues?state=open&labels=pm:queue,domain:skills&per_page=100 → the same 10 numbers. Positive control that the anchors are not page chrome: the one-label page returns a different set, and all four numbers present only in the two-label page carry both labels on an API read.
    ⚠️ And the counterpart negative that keeps it usable: the one-label page rendered 12 anchors where REST returns a full first page of 100. The anchor set is the answer only where it can prove it is complete — which is why the line records both halves and :164's 「⛔ 永不拿渲染列表定规模」 is left standing.
  • The PR page carries raw comment markdown; the issue page does not. the PR page for docs(pm-skill): the seventh readings increment — seven landed lines, one in-place correction, and a NON-reproduction #16764 on github.com → 200, two clipboard-copy value= carriers holding the PR body (15,452 chars) and a comment verbatim. The same extraction over this card's own issue page yields zero comment carriers — its nine clipboard-copy hits are code-block copy buttons.
  • api.github.com answers 200 here with no Authorization header at all, while the rider's container got 403 with the proxy's own body on the same path. Reachability forks per session and per URL shape; neither reading generalises, which is what the new line says.

4. Dedup — every landed reading grepped against the ledger at origin/main

Two zero-hit greps per reading (one Chinese term, one English/identifier term) plus a positive control that hits, all run against git show HEAD:.claude/skills/pm-dispatch/references/platform-readings.md (402 lines):

reading CN term (hits) EN term (hits) positive control (hits)
create-side discriminator 尾部已是 0 create_pull_request 0 POST /pulls 2
body-less call changes nothing 既不删也不合成 0 no body 0 update_pull_request 3
no controlled pair ⇒ a fit 受控对照 0 controlled pair 0 实测 10
the strip is the one row outside the fit 唯一不合 0 strip 0 update_pull_request 3
stacked harness block ⇒ three blocks 三条署名块 0 attribution block 0 署名页脚 3
comment PATCH is idempotent 评论 PATCH 0 comments/{id} 0 评论创建两通道 1
issue-body PATCH normalises to one 归一到末尾 0 one footer 0 PATCH /issues/{n} 1
bounded queue window 满窗 0 merge_group run 0 merge_group 5
webhook payload also names merge 载体一致 0 auto_merge_enabled 0 merge_method 2
squash rewrites the co-author trailer 作者身份改拼 0 Claude-Session 0 squash 3
web reachability forks per URL shape 网页档 0 /actions/** 0 403 20
classifier refusal is a third mechanism 权限分类器 0 permission classifier 0 403 20
PR page carries raw comment markdown 原始 markdown 0 clipboard-copy 0 payload 5
issue page is blind to that carrier 盲态 0 value 属性 0 issue 页 1
query page anchors AND, and truncate 逐号相等 0 SSR 锚点 0 SSR 1
search zeros fork by term shape 带引号短语 0 camelCase 0 search_issues 3
head-filtered four-piece read-back 请审人 0 head: owner 0 list_pull_requests 3
--pair exits 4 on a real failure 真缺声明 0 exit 4 0 check-clause2-carriers.mjs 1

Already present — not rewritten (the grep HITS, and that is the verdict):

reading the row that already carries it
direct REST is reachable from this container REST 可达性是会话属性 1 · core 上限 15000 1
auto_merge reads null after a successful enable ⇒ read the timeline auto_merge 字段…不稳定 1 · timeline 入队事件 1
removed_from_merge_queue on a clean landing is not an eviction 后 ~1 秒内跟 1 (removed_from_merge_queue 2)
list_issues does not AND its labels array 数组是并集 1

Refused, with the reason:

reading why it is not a line
repo merge configuration (allow_auto_merge / allow_squash_merge / …) a settings snapshot, not a platform behaviour; allow_merge_commit already appears where it changes a reading, and provenance-style records were removed from this corpus by the rules-only rewrite
「一条标着未复测的继承事实,在你依据它改变做法的那一刻必须复测」 a PRESCRIPTION, and this card's acceptance says the lines record the readings, ⛔ not a new rule. It belongs to whoever owns the prescription file
the proposed AGENTS.md CREATE-clause wording another file and another card; ⛔ this PR touches no prescription
rider F's :109 re-measurement read as falsifying the row it does not: both runs had a token present, so the token axis the row is about was never varied. Recorded as a SCOPE correction instead, which is what the rider itself argued

5. Line budget

402 → 419 (+17 new lines, 5 corrections in place, ⛔ no re-wrap counted as payment — the fourth increment measured zero line-neutral folds in this file and re-wrap funding is refused in any case).

Per-line bytes of everything added or rewritten (cap 120):

 54 120B  auto_merge_enabled webhook payload names `merge` too
 55 106B  squash rewrites the authored co-author trailer
 82 117B  the queue's bounded build window
112 110B  --pair: no 403/exit-3 in-container, exit 4 on a real failure   (correction)
154 119B  web-page reachability forks per session and per URL shape
155 118B  the local classifier's pre-network refusal is not a 403
168 119B  PR page carries raw markdown in clipboard-copy value
169 117B  issue page carries no such thing
170  94B  public-page boundary row                                       (correction)
172 119B  query-page anchors AND, and truncate silently
175 111B  qualifier-shaped queries: 亦可回 0                              (correction)
176 112B  the zeros fork by term shape
223 104B  head-filtered one-call read-back
321 113B  create-side discriminator                                      (correction)
323 120B  nothing appended when the tail is already the block
324 107B  no controlled pair ⇒ a fit, not a finding
325 109B  a call with no body argument changes nothing
326 120B  the strip is the one observation outside the fit
327 106B  a stacked harness block stores three
328 112B  the cell's closing row                                         (correction)
331 115B  comment PATCH is idempotent
372 112B  issue-body PATCH normalises to one footer

The ruledRaises record added to scripts/pm/check-skill-line-ratchet.mjs quotes the standing exception verbatim and untranslated, in the shape the previous seven records use, with delta: 17.

6. Gates

Derived, not recalled: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack with no paths (it takes its own change set from the merge base) → 38 commands. All 38 run, exit code captured before any pipe.

  • pnpm check:pm-skill-ratchet0 (the ceiling row equals the landed count; its own 157-case self-test passes)
  • pnpm check:pm-skill-id-lint0 · pnpm check:skill-frame-sync0 · pnpm check:doc-authoring0 · pnpm check:nul-bytes0 · pnpm check:pm-governed-merges0
  • pnpm check:ratchet-remedy-authority0 · pnpm check:required-contexts0 · the remaining 29 → 0
  • pnpm --filter @objectstack/lint run check:doc-formula-expressions first returned exit 3, PREREQUISITE NOT MET (unbuilt workspace packages — NOT a finding and not a measurement). Built @objectstack/formula + @objectstack/lint through the shared verify lock and re-ran → 0.
  • node scripts/pm/check-governed-merges.mjs --test on the two changed paths → exit 3, .claude/** ×1: "GOVERNED — a human merge is the review record for this PR", one hit governs the whole PR.

skip-changeset: nothing published moves — .claude/** and scripts/pm/** are both on the fast track.

维护者速读(草稿)

改了什么 — 平台读数账本 platform-readings.md 的第八次增量:落 17 行新读数、原地改 5 行(不是新增),行数 402 → 419;棘轮脚本里该文件的上限行同步抬到 419,并按常设例外记一条 ruledRaises(逐字引 SKILL.md 那句,不翻译)。候选 25 条(卡正文 4 条 + 11 条 rider 评论),去重后 20 落地 / 3 已有 / 2 拒收。

为什么改 — 这张卡是本轮读数的载体卡,十一条 rider 评论各带自己的 n。它们里最要紧的一组彼此矛盾:署名页脚到底会不会被平台追加,同一条通道有人测到追加、有人测到不追加。把它们按「送出体尾部长什么样」排成一张真值表,矛盾就消失了 —— 判据是你送出去的正文结尾,不是你走 MCP 还是裸 REST。账本原来那行把追加归因给「裸 REST 建 PR」,是错的归因,这次原地改掉。另外四条原地改的行,都是同一形状:话本身没错,但脱离上下文读会把人引到危险方向(尤其 --pair 那行,会让人把一次真实的拒绝当成容器假象)。

风险与代价(含回滚) — 只动两个文件,都是 agent 自己读的规则/事实,不进产物、不影响任何发布包(所以 skip-changeset)。风险面是「写错事实比不写更糟」:因此每条落地行都做了中英各一次零命中 grep 加一个必中的阳性对照,三条命令与计数在正文第 4 节;三条来自别人容器的读数,我在本容器里重测了(搜索页锚点、PR 页评论载体、api 主机可达性),重测结果与相邻行一起写进去。回滚 = revert 这一个提交,账本回到 402 行、上限行回到 402,无生成物、无下游依赖。

席位意见 — (留空,待席位复核填写)

你要做的 — 这是受管面(.claude/**),按 Prime Directive #14 只能由您手工合并:任何 agent 都不会把它转 ready、不会入队、不会挂 auto-merge。您需要看的是三样:① 第 1 节那张真值表的结论您认不认(「建 PR 侧通道不是变量」);② 第 2 节五条原地改的前后对照,尤其 :109:167 —— 它们弱化了两句原来说得很硬的话;③ 第 4 节的拒收四条,看有没有您认为不该拒的。认可就手工合并,不认可直接在 PR 上说撤哪一条。

验收备注(范围外的观察 — noted, not filed)

  • 本 PR 自己的建 PR 调用是第四条同向读数:裸 REST POST /pulls,送出体尾部是空行 + 横线 + session-URL 页脚块,存回 15520 B 对送出 15521 B,差恰一个被剥的行尾换行,页脚一条、零追加、unified diff 只剩那一行。它与第 1 节真值表同向,⛔ 不写进本次账本 —— 本卡的候选集在派发时封口 —— 留给第九次增量。
  • 卡的验收段把 check-skill-line-ratchet / check-skill-id-lintcheck-governed-merges --test 并列写成「exit 3」。实测:前两者通过时是 exit 0,只有 governed-merges 的治理判定是 exit 3。按实测报告,⛔ 未改卡。
  • 卡的验收段还列了 needs-user-decision 标签与 os-zhuang 请审。派发词的裁决区只授权 draft PR 加 skip-changeset,所以这两件留给席位在 ACCEPT 时武装,dev ⛔ 未代做。

Generated by Claude Code


Generated by Claude Code

… in-place corrections, ceiling 402 → 419

The carrier card invited riders as comments, so the candidate set was 25
readings — four in the body and 21 across eleven rider comments. Deduplicated
against the ledger: 20 landed (17 new lines plus five corrections paid in
place), three already present, two refused.

The footer family is the reason this increment is not a list. Five riders and
both body readings describe one cell and disagree as long as the CHANNEL is
read as the variable; sorted by what the SENT body ended with they stop
disagreeing, so the create-side row's bare-REST-only attribution is corrected
in place and the discriminator lands as its own line. One observation stays
outside the fit — the MCP update wrapper's strip, whose input shape was never
recorded — and lands as exactly that rather than being smoothed over. No
controlled pair has been sent, so the line says fit, not finding.

Four other rows are corrected in place for the same shape of defect: text
whose correct reading lives in its paragraph and not in its own words. The
`--pair` row is the dangerous one — lifted out of its paragraph it reads as
"always exits 0 in-container", which would have a seat discount a real exit-4
refusal as a container artifact.

Three readings taken in other containers were re-measured here rather than
relayed: the public issues query page does serve SSR anchors and does AND its
`label:` filters (10 anchors, number-for-number equal to the REST result, with
the one-label page truncating 100 to 12); the PR page carries raw comment
markdown in `clipboard-copy` value attributes while the issue page carries
none; and `api.github.com` answers 200 here where it answered 403 there.

The ceiling row moves to the landed count under the standing one-file
exception, recorded as a `ruledRaises` record quoting it verbatim and
untranslated, with delta 17.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HxLw5aKDPR5RJgyUR7Exkd

Copy link
Copy Markdown
Collaborator Author

维护者速读 — PR #17084(#16779,skills 席终稿,2026-09-09T07:18Z)

改了什么 — 平台读数账本 platform-readings.md 第八批增量:25 条候选读数(卡正文 4 条 + 11 条 rider 评论)逐条对账本去重后,落地 17 行新读数、原地更正 5 行、3 条已有、2 条拒收;上限按常设例外从 402 抬到 419,棘轮脚本记一条 ruledRaises 引用该例外原文。最有价值的一处:五条互相打架的「PR 正文页脚追加」读数先并成一张真值表——变量不是通道,是送出体的尾部(尾部已是横线+页脚块就一字不追加,两通道各实测两向),账本原来把通道当变量的那一行据此改正。

为什么改 — 这些读数是各席位一天里实测踩到的平台行为(合并队列窗口有界、squash 重写署名 trailer、搜索零命中按词形分叉、网页可达性按 URL 形状分叉、公开查询页有 SSR 锚点且 label: 是真 AND 等),不进账本就每个席位再踩一次。

风险与代价(含回滚) — 纯账本文本,不改任何处方性规则(拒收了一条「未复测即须复测」的规则提案,因为卡面说明只记读数);回滚 = revert 本 PR,上限回 402。代价:+17 行,按常设例外免决策卡。

席位意见 — 接受。本席在分支头上复核:棘轮 419/419、自测 157 通过;22 行全部 ≤120 字节、无日期、无卡号(id-lint 干净);frame-sync 绿;受管判定 exit 3;去重表 18 行每行带阳性对照;mergeable: true;CI 收敛中(07:15Z 两个 job 进行中)。

你要做的 — 合并;或由 os-zhuang / hotlong 批准,本席随即入队。看一处即可:页脚真值表那一段(账本 :321–:328)是否与你自己的经验一致。


Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation needs-user-decision size/s skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

3 participants